#ifndef MY_HEADER_H
#define MY_HEADER_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <stdbool.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <pwd.h>        // for getpwuid()
#include <grp.h>        // for getgrgid()
#include <dirent.h>     // dirent是directory entry的简写，就是目录项的意思
#include <sys/mman.h>
#include <sys/wait.h>
#include<sys/select.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <signal.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <errno.h>
#include <mysql/mysql.h>
#include <shadow.h>
#include <crypt.h>
#include <syslog.h>


// 检查命令行参数数量是否符合预期
#define ARGS_CHECK(argc, expected)\
    do {\
        if ((argc) != (expected)) {\
            fprintf(stderr, "args num error!\n");\
            exit(1);\
        }\
    } while (0)                      

// 检查返回值是否是错误标记,若是则打印msg和错误信息
#define ERROR_CHECK(ret, error_flag, msg)\
    do {\
        if ((ret) == (error_flag)) {\
            perror(msg);\
            exit(1);\
        }\
    } while (0)

#define THREAD_ERROR_CHECK(ret,msg)\
    do{\
        if((ret)!=0){\
            fprintf(stderr,"%s:%s\n",msg,strerror(ret));\
            exit(1);\
        }\
    } while(0)
        
#endif